package com.whcoding.test.common.encrypt;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Decoder;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.UUID;

/**
 * @program: spring-boot-learning
 * @description:
 * @author: whcoding
 * @create: 2022-05-25 14:13
 **/
public class Base64Util {
	private static final Logger logger = LoggerFactory.getLogger(Base64Util.class);


	/**
	 * 对字符串进行Base64加密
	 *
	 * @param source
	 * @return encodedText
	 */
	public static String base64Encode(String source) {
		String encodedText = "";
		try {
			final Base64.Encoder encoder = Base64.getEncoder();
			final byte[] textByte = source.getBytes("UTF-8");
			encodedText = encoder.encodeToString(textByte);
		} catch (UnsupportedEncodingException e) {
			logger.error("base64 encode exception", e);
		}
		return encodedText;
	}

	/**
	 * 对字符串进行Base64解密
	 *
	 * @param source
	 * @return decodedText
	 */
	public static String base64Decode(String source) {
		String decodedText = "";
		try {
			BASE64Decoder decoder = new BASE64Decoder();
			byte[] bytes = decoder.decodeBuffer(source);
			decodedText = new String(bytes);
		} catch (UnsupportedEncodingException e) {
			logger.error("base64 encode exception", e);
		} catch (IOException e) {
			logger.error("base64 encode exception", e);
		}
		return decodedText;
	}


	public static void main(String[] args) {
		String text = "hello";
		/**
		 * static Base64.Encoder getEncoder()
		 * 返回一个 Base64.Encoder ，编码使用基本型 base64 编码方案。
		 */
		String base64encodedString = Base64.getEncoder().encodeToString(text.getBytes(StandardCharsets.UTF_8));
		System.out.println("Base64 编码字符串 (基本) :" + base64encodedString);

		/**
		 * static Base64.Decoder getDecoder()
		 * 返回一个 Base64.Decoder ，解码使用基本型 base64 编码方案。
		 */
		byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
		System.out.println("原始字符串: " + new String(base64decodedBytes, StandardCharsets.UTF_8));

		/**
		 * static Base64.Encoder getUrlEncoder()
		 * 返回一个 Base64.Encoder ，编码使用 URL 和文件名安全型 base64 编码方案。
		 */
		base64encodedString = Base64.getUrlEncoder().encodeToString(text.getBytes(StandardCharsets.UTF_8));
		System.out.println("Base64 编码字符串 (URL) :" + base64encodedString);

		/**
		 * static Base64.Decoder getUrlDecoder()
		 * 返回一个 Base64.Decoder ，解码使用 URL 和文件名安全型 base64 编码方案。
		 */
		byte[] base64decodedBytes2 = Base64.getUrlDecoder().decode(base64encodedString);
		System.out.println("原始字符串: " + new String(base64decodedBytes2, StandardCharsets.UTF_8));

		StringBuilder stringBuilder = new StringBuilder();

		for (int i = 0; i < 10; ++i) {
			stringBuilder.append(UUID.randomUUID().toString());
		}

		byte[] mimeBytes = stringBuilder.toString().getBytes(StandardCharsets.UTF_8);
		String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
		System.out.println("Base64 编码字符串 (MIME) :" + mimeEncodedString);

	}
}
